#ifndef VSql_H
#define VSql_H

#include "VSqlQuery.h"
#include "VSqlProc.h"

class VSqlInit
{
public:
	VSqlInit()
	{
		struct Field
		{
			QString name; bool enEdit; bool inDb; QString dbTable; QString dbField; QString PrimaryKey;
		} 
		fields[] = 
		{
			{"VidName.idName",			false,	true,	"VidName",	"idName" ,			"idName"},
			{"VidName.unicod",			true,		true,	"VidName",	"unicod" ,			"idName"},
			{"VidName.capion",			true,		true,	"VidName",	"caption",			"idName"},

			{"VidNav.idNav",				false,	true,	"VidNav",		"idNav",				"idNav"},
			{"VidNav.idNavParent",	true,		true,	"VidNav",		"idNavParent",	"idNav"},
			{"VidNav.idName",				true,		true,	"VidNav",		"idName",				"idNav"},
			{"VidNav.unicod",				true,		true,	"VidNav",		"unicod",				"idNav"},
			{"VidNav.pos",					true,		true,	"VidNav",		"pos",					"idNav"}
		};
		
		int count = sizeof(fields)/sizeof(Field);
		for (int i = 0; i < count; ++i)
		{
			Field &field = fields[i];
		
		}
	}
};

class VSqlTest : public VSqlQuery
{
public:
	VSqlTest(QSqlDatabase& db) : VSqlQuery(db) 
	{
		addParamOut("idName");
		addParamOut("unicod");

		prepare
		(
			"select idName,unicod "
			"from   VidName "
		);
	}
};

class VSqlTestP : public VSqlProc
{
public:
	VSqlTestP(QSqlDatabase& db) : VSqlProc(db) 
	{
		addParamIn("unicod");
		addParamIn("caption");
		addParamIn("idDb");

		addParamOut("idName");
		addParamOut("retUnicod");

		prepare("VidAddName");
	}
};


/******************
///////////////////////////////////////////////////////////////////////////////

class VDictSqlProcNewName : public VSqlProc
{
public:
	VDictSqlProcNewName(QSqlDatabase& db) : VSqlProc(db) {
		addParamIn(VDict::name());  // FName
		addParamIn(VDict::title()); // FTitle

		addParamOut(VDict::nameId());           // FNameId
		addParamOut(VDict::dateCreationName()); // FCreate

		bindProc("PNewName");
	}
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlProcAddLink : public VSqlProc
{
public:
	VDictSqlProcAddLink(QSqlDatabase& db) : VSqlProc(db) {
		addParamIn(VDict::parentLinkId()); // FParentLinkId
		addParamIn(VDict::nameId()); // FNameId

		addParamOut(VDict::linkId()); // FLinkId
		addParamOut(VDict::dateCreationLink()); // FCreate
		addParamOut(VDict::pos()); // FPos

		bindProc("PAddLink");
	}
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlProcInsertLinkBefore : public VSqlProc
{
public:
	VDictSqlProcInsertLinkBefore(QSqlDatabase& db) : VSqlProc(db) {
		addParamIn(VDict::linkId()); // FCurrentLinkId
		addParamIn(VDict::nameId()); // FNameId

		addParamOut(VDict::linkId()); // FLinkId
		addParamOut(VDict::parentLinkId()); // FParentLinkId
		addParamOut(VDict::dateCreationLink()); // FCreate
		addParamOut(VDict::pos()); // FPos

		bindProc("PInsLinkBefore");
	}
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlProcInsertLinkAfter : public VSqlProc
{
public:
	VDictSqlProcInsertLinkAfter(QSqlDatabase& db) : VSqlProc(db) {
		addParamIn(VDict::linkId()); // FCurrentLinkId
		addParamIn(VDict::nameId()); // FNameId

		addParamOut(VDict::linkId()); // FLinkId
		addParamOut(VDict::parentLinkId()); // FParentLinkId
		addParamOut(VDict::dateCreationLink()); // FCreate
		addParamOut(VDict::pos()); // FPos

		bindProc("PInsLinkAfter");
	}
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlProcDeleteLink : public VSqlProc
{
public:
	VDictSqlProcDeleteLink(QSqlDatabase& db) : VSqlProc(db) {
		addParamIn(VDict::linkId()); // FLinkId

		bindProc("PDelLink");
	}
};
**********************/

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/**********
class VDictSqlMoveLink : public VSqlQuery
{
public:
	VDictSqlMoveLink(QSqlDatabase& db) : VSqlQuery(db) {
		addParamIn(VDict::parentLinkId());
		addParamIn(VDict::linkId());

		bindSql(
			"update TLinks "
			"set    FParentLinkId = :0 "
			"where  FLinkId = :1"
		);
	}
};
****************/
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

/********************************************
class VDictSqlSelectValues
{
public:
	VDictSqlSelectValues(QSqlDatabase& db) : mDb(db) {}
	
	static QMap<QString,QString> mapDbFields();

	QList<VRecord> exec(const QVariant& linkId,const VRecord& prototype) const;
	
private:
	QSqlDatabase& mDb;
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlSelectChildren
{
public:
	VDictSqlSelectChildren(QSqlDatabase& db) : mDb(db) {}
	
	QList<VRecord> exec(const QVariant& parentLinkId,const VRecord& prototype);
	
private:
	QSqlDatabase& mDb;
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlSelectParents
{
public:
	VDictSqlSelectParents(QSqlDatabase& db) : mDb(db) {}
	
	QList<VRecord> exec(const QVariant& linkId,const VRecord& prototype) const;
	
private:
	QSqlDatabase& mDb;
};

///////////////////////////////////////////////////////////////////////////////

class VDictSqlUpdateValue
{
public:
	VDictSqlUpdateValue(QSqlDatabase& db) : mDb(db) {}
	
	void exec(const QString& name,const VRecord& record);
	
private:
	QSqlDatabase& mDb;
};
*********************************/

///////////////////////////////////////////////////////////////////////////////

#endif 
